package com.blog.cmrpersonalblog.service;

import com.blog.cmrpersonalblog.dto.article.response.UserArticleDetailResponse;
import com.blog.cmrpersonalblog.dto.article.request.UserArticleCreateRequest;
import com.blog.cmrpersonalblog.dto.user.request.UserArticleUpdateRequest;
import com.blog.cmrpersonalblog.dto.article.response.UserArticleResponse;
import com.blog.cmrpersonalblog.dto.user.response.UserInteractionStatus;

import java.util.List;

/**
 * 用户端文章服务接口
 * 提供面向普通用户的文章查看、交互功能
 */
public interface UserArticleService {

    /**
     * 获取文章详情（用户端）
     * 包含完整的文章内容、作者信息、统计数据等
     * 
     * @param articleId 文章ID
     * @param userId 当前用户ID（可为空，用于判断点赞、收藏状态）
     * @param updateViewCount 是否更新浏览量
     * @return 文章详情
     */
    UserArticleDetailResponse getArticleDetail(Long articleId, Long userId, boolean updateViewCount);

    /**
     * 增加文章浏览量
     * 
     * @param articleId 文章ID
     * @param userId 用户ID（可为空）
     * @param ipAddress IP地址
     * @param userAgent 用户代理
     */
    void incrementViewCount(Long articleId, Long userId, String ipAddress, String userAgent);

    /**
     * 获取相关文章推荐
     * 基于分类、标签、作者等维度推荐相关文章
     * 
     * @param articleId 当前文章ID
     * @param limit 推荐数量限制
     * @return 相关文章列表
     */
    List<UserArticleDetailResponse.RelatedArticleInfo> getRelatedArticles(Long articleId, Integer limit);

    /**
     * 文章点赞/取消点赞
     * 
     * @param articleId 文章ID
     * @param userId 用户ID
     * @param isLike true-点赞，false-取消点赞
     * @return 操作结果
     */
    boolean toggleArticleLike(Long articleId, Long userId, boolean isLike);

    /**
     * 文章收藏/取消收藏
     * 
     * @param articleId 文章ID
     * @param userId 用户ID
     * @param isCollect true-收藏，false-取消收藏
     * @return 操作结果
     */
    boolean toggleArticleCollect(Long articleId, Long userId, boolean isCollect);

    /**
     * 检查用户对文章的交互状态
     * 
     * @param articleId 文章ID
     * @param userId 用户ID
     * @return 包含点赞、收藏状态的映射
     */
    UserInteractionStatus getUserInteractionStatus(Long articleId, Long userId);

    /**
     * 创建文章（用户端）
     * 
     * @param request 文章创建请求
     * @param userId 当前用户ID
     * @return 创建的文章信息
     */
    UserArticleResponse createArticle(UserArticleCreateRequest request, Long userId);

    /**
     * 更新文章（用户端）
     * 只能更新自己发布的文章
     * 
     * @param request 文章更新请求
     * @param userId 当前用户ID
     * @return 更新后的文章信息
     */
    UserArticleResponse updateArticle(UserArticleUpdateRequest request, Long userId);

    /**
     * 删除文章（用户端）
     * 只能删除自己发布的文章
     * 
     * @param articleId 文章ID
     * @param userId 当前用户ID
     * @return 删除结果
     */
    boolean deleteArticle(Long articleId, Long userId);

    /**
     * 获取用户的文章列表
     * 
     * @param userId 用户ID
     * @param status 文章状态（可选，null表示所有状态）
     * @param current 当前页
     * @param size 每页大小
     * @return 用户文章列表
     */
    List<UserArticleResponse> getUserArticles(Long userId, Integer status, Long current, Long size);

    /**
     * 发布草稿文章
     * 
     * @param articleId 文章ID
     * @param userId 当前用户ID
     * @return 发布结果
     */
    boolean publishDraft(Long articleId, Long userId);

    /**
     * 下架已发布的文章
     * 只能下架自己发布的文章，且文章必须处于已发布状态
     * 
     * @param articleId 文章ID
     * @param userId 当前用户ID
     * @return 下架结果
     */
    boolean withdrawArticle(Long articleId, Long userId);
}
